package pri.damai.xiaowu.goods.server.config;

import lombok.extern.slf4j.Slf4j;
//import org.springframework.amqp.core.Binding;
//import org.springframework.amqp.core.BindingBuilder;
//import org.springframework.amqp.core.Queue;
//import org.springframework.amqp.core.TopicExchange;
//import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
//import org.springframework.amqp.rabbit.core.RabbitTemplate;
//import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Qualifier;
//import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author DaMai
 * @description:
 * @date 2020/7/31 11:20
 */
@Configuration
@Slf4j
public class RabbitMQConfig {
//
//    /** 示例交换机 **/
//    public final static String COMMON_EXCHANGE = "common_exchange";
//    /** 示例队列 **/
//    public final static String COMMON_QUEUE = "common_queue";
//    /** 路由key */
//    public final static String COMMON_KEY = "common_key";
//
//
//    @Autowired
//    private CachingConnectionFactory connectionFactory;
//
//    @Bean
//    public Queue commonQueue() {
//        return new Queue(COMMON_QUEUE,true);
//    }
//
//    @Bean
//    public TopicExchange exchange() {
//        return new TopicExchange(COMMON_EXCHANGE,true,false);
//    }
//
//
//    @Bean
//    public Binding bindingRefund(@Qualifier("commonQueue") Queue commonQueue, @Qualifier("exchange") TopicExchange exchange) {
//        return BindingBuilder.bind(commonQueue).to(exchange).with(COMMON_KEY);
//    }
//
//
//    /**
//     * 为保证消息百分百被投递，后期可以针对此处做优化
//     * 优化思路：
//     *      1. 投递消息时，以消息id为key，将消息存放到redis中。
//     *      2. 触发投递失败回调，从redis中取出消息，设为投递失败。
//     *      3. 收到投递成功的消息后，触发ack回调把redis中的消息删掉。
//     *      4. 处理投递失败的消息(处理办法自定义)
//     * @return
//     */
//    @Bean
//    public RabbitTemplate rabbitTemplate() {
//
//        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
//        rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
//
//        // 投递消息回调，不能单靠ack来确认投递是否成功。
//        // 如果发送到交换器成功，但是没有匹配的队列（比如说取消了绑定），ack 返回值为还是 true （这是一个坑，需要注意）
//        // 2022年4月6日 22点03分：这里只匹配交换机
//        rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
//            // todo 后续优化此处，处理投递失败
//            if (ack) {
//                log.info("【rabbitMQ】exchange 接受消息。correlationData: {}, ack:{}, cause:{} 。",correlationData, ack,cause);
//            }else {
//                log.info("【rabbitMQ】exchange 未接受消息。correlationData: {}, ack:{}, cause:{} 。",correlationData, ack,cause);
//            }
//        });
//
//        // 触发setReturnCallback回调必须设置mandatory=true, 否则Exchange没有找到Queue就会丢弃掉消息, 而不会触发回调
//        rabbitTemplate.setMandatory(true);
//
//        // 消息是否从Exchange路由到Queue, 注意: 这是一个失败回调, 只有消息从Exchange路由到Queue失败才会回调这个方法
//        // 2022年4月6日 22点04分：交换机匹配过之后，才会去匹配队列。
//        rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
//            // todo 后续优化此处，处理投递失败
//            log.info("【rabbitMQ】QUEUE 匹配失败。message:{}, replyCode:{}, replyText:{}, exchange:{}, routingKey:{}",message,replyCode,replyText,exchange,routingKey);
//        });
//        return rabbitTemplate;
//    }

}
